package cc.bukkitPlugin.banitem.command.analyse;

import org.bukkit.Material;
import org.bukkit.command.CommandSender;

import cc.bukkitPlugin.banitem.BanItemEnume.ListType;
import cc.bukkitPlugin.banitem.BanItemEnume.OperateType;
import cc.bukkitPlugin.banitem.CFG;
import cc.bukkitPlugin.banitem.check.SimpleWorld;
import cc.bukkitPlugin.util.plugin.ABukkitPlugin;

public class AnalyseResult{

    /**要操作的物品*/
    public Material mItem=null;
    /**要操作的物品的子id,默认为null,-1代表全部*/
    public Short mDamage=null;
    /**要进行的操作*/
    public OperateType mOperate=null;
    /**要操作的列表*/
    public ListType mListType=null;
    /**NBT节点名*/
    public String mNBTLabel=null;
    /**NBT节点的值*/
    public String mNBTValue=null;
    /**在哪个世界*/
    public SimpleWorld mWorld=SimpleWorld.defaultWorld;
    /**物品被加入列表的原因*/
    public String mReason=null;
    /**是否查找到该配置*/
    public boolean mFind=true;
    /**变量建立结果*/
    public boolean mBuildError=false;
    /**变量建立结果*/
    public String mBuildErrorMsg="";
    /**不匹配的原因*/
    public String mUnFitReason="";

    /**
     * 将CmdParam中的内容以消息的形式发送给玩家
     * @param pSender
     */
    public void sendInfo(CommandSender pSender){
        this.sendInfo(pSender,CFG.cfg_color+"  |");
    }

    /**
     * 将CmdParam中的内容以消息的形式发送给玩家
     * @param pPrefix 消息前缀
     */
    public void sendInfo(CommandSender pSender,String pPrefix){
        if(mItem==null)
            return;
        if(pPrefix==null)
            pPrefix="";
        ABukkitPlugin.send(pSender,pPrefix+this.mItem.name()+"("+this.mItem.getId()+")");
        if(this.mDamage==null)
            return;
        if(this.mListType==ListType.NBT){
            ABukkitPlugin.send(pSender,pPrefix+"  damage@"+mDamage+": {}");
        }else{
            ABukkitPlugin.send(pSender,pPrefix+"  damage@"+mDamage+":");
            if(this.mReason!=null)
                ABukkitPlugin.send(pSender,pPrefix+"    reason: "+this.mReason);
            if(this.mNBTLabel!=null){
                ABukkitPlugin.send(pSender,pPrefix+"    nbt:");
                ABukkitPlugin.send(pSender,pPrefix+"      "+this.mNBTLabel+":");
                if(this.mNBTValue!=null)
                    ABukkitPlugin.send(pSender,pPrefix+"      - "+this.mNBTValue);
            }
        }
    }

    public AnalyseResult setUnfitReason(String pReason){
        this.mUnFitReason=(pReason==null?"":pReason);
        this.mFind=false;
        return this;
    }

    public AnalyseResult noItemFound(Material pMaterial){
        this.mItem=pMaterial;
        return this.setUnfitReason("&c配置中没有["+pMaterial.name()+"("+pMaterial.getId()+")]这个物品");
    }

    public AnalyseResult noDamageFound(short pDamage){
        this.mDamage=pDamage;
        return this.setUnfitReason("&c配置中没有["+pDamage+"]这个子id");
    }

    public AnalyseResult noNBTLabelFound(String pNBTLabel){
        this.mNBTLabel=pNBTLabel;
        return this.setUnfitReason("&c配置中没有["+pNBTLabel+"]这个NBT标签");
    }

    public AnalyseResult noNBTValueFound(String pNBTLabel,String pNBTValue){
        this.mNBTValue=pNBTValue;
        return this.setUnfitReason("&c配置中["+pNBTLabel+"]NBT标签没有["+pNBTValue+"]这个NBT值");
    }

    /**
     * 此函数用于命令参数建立,设置解析失败消息
     */
    public AnalyseResult buildError(String pErrorMsg){
        if(pErrorMsg==null)
            pErrorMsg="";
        this.mBuildErrorMsg=pErrorMsg;
        this.mBuildError=true;
        return this;
    }

    /**
     * 此函数用于命令参数建立,设置成功解析参数
     */
    public AnalyseResult buildSuccess(){
        this.mBuildError=false;
        return this;
    }

    /**
     * 此函数用于禁用列表检查,设置原因使用
     * @param pReason 原因
     * @return find为true的实例
     */
    public static AnalyseResult find(String pReason){
        AnalyseResult tCmdParam=new AnalyseResult();
        tCmdParam.mReason=pReason;
        tCmdParam.mFind=true;
        return tCmdParam;
    }

    /**
     * 此函数用于列表检查,设置原因使用
     * @param pReason 原因
     * @return find为true的实例
     */
    public static AnalyseResult notFind(){
        AnalyseResult tCmdParam=new AnalyseResult();
        tCmdParam.mFind=false;
        return tCmdParam;
    }

    /**
     * 此函用于配置物品匹配检查
     */
    public AnalyseResult setFind(boolean pFind){
        this.mFind=pFind;
        return this;
    }

}
